//package com.vincent.redispractise.JedisPackage.threadSafe;
//
//import redis.clients.jedis.Jedis;
//import redis.clients.jedis.JedisPool;
//import redis.clients.jedis.JedisPoolConfig;
//
//import java.util.concurrent.CountDownLatch;
///*
//  maven坐标{001jedis坐标}
//*/
///**
// * @Des 测试jedis线程安全的问题
// *      [测试思路：
// *        使用连接池，每个线程使用一个独立的连接，这样就不会共享socket
// *      ]
// *      使用jedis的pom坐标
// *         <dependency>
// *             <groupId>redis.clients</groupId>
// *             <artifactId>jedis</artifactId>
// *             <version>2.9.0</version>
// *         </dependency>
// * @Date 2022/10/28 14:11
// * @Param  * @param null
// * @Return
// */
//  public class JedisThreadSafe {
//
//  private static JedisPool jedisPool = null;
//
//  static {
//    //1.创建连接池配置对象
//    JedisPoolConfig config = new JedisPoolConfig();
//    //2.配置连接池参数
//    //2.1忙时最大连接（最大连接数）
//    config.setMaxTotal(8);//连接池的最大连接数。使用负数表示无极限。
//    //2.2闲时最大连接（最小连接数）
//    config.setMaxIdle(2);//连接池的最大空闲连接数。如果值很小的话会频繁的创建销毁连接导致性能开销增加。
//    //2.*闲时最小连接数
//    config.setMinIdle(0);//连接池的最小空闲连接数。确保池满足要求在空闲对象回收运行期间的最小实例数。minIdle配置值大于配置值对于maxIdle，则将使用maxIdle的值。
//    //2.3超时时间
//    config.setMaxWaitMillis(30000);
//    //2.4获取连接池检查时机
//    config.setTestOnBorrow(true);
//    //3.通过连接池配置对象，设置参数
//    //    jedisPool = new JedisPool(config, "192.168.159.70", 6379, 3000, "123456");
//    jedisPool = new JedisPool(config, "192.168.59.250", 6379, 3000, "123456");
//  }
//
//  /*
//    释放连接
//   */
//  public static void close(Jedis jedisConnection) {
//    jedisConnection.close();
//  }
//
//  /*
//    摧毁连接池
//   */
//  public static void destroy() {
//    jedisPool.destroy();
//  }
//
//  public static void main(String[] args) {
//    CountDownLatch latch = new CountDownLatch(10);
//    Runnable r1 = () -> {
//      for (int j = 0; j < 5; j++) {
//        Jedis jedis = jedisPool.getResource();
//        jedis.set("A1", "a1");
//        System.out.println("A1" + " is:" + jedis.get("A1"));
//        latch.countDown();
//        //归还连接
//        close(jedis);
//      }
//    };
//    new Thread(r1).start();
//    Runnable r2 = () -> {
//      for (int j = 0; j < 5; j++) {
//        Jedis jedis = jedisPool.getResource();
//        jedis.set("A2", "a2");
//        System.out.println("A2" + " is:" + jedis.get("A2"));
//        latch.countDown();
//        //归还连接
//        close(jedis);
//      }
//    };
//    new Thread(r2).start();
//    try {
//      latch.await();
//      destroy();
//    } catch (Exception e) {
//      e.printStackTrace();
//    }
//  }
//}
